一、DML语句
	//使用前提：得有一张表
	1. 添加数据：
		* 语法：
			* insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
				//insert而不是create     values 而不是 value
		* 注意：
			1. 列名和值要一一对应。
			2. 如果表名后，不定义列名，则默认给所有列添加值
				insert into 表名 values(值1,值2,...值n);
			3. 除了数字类型，其他类型需要使用引号(单双都可以)引起来   //日期类型一定要加引号
				INSERT INTO USER VALUES(1,"南京黑马第一帅玮","1234qwer");
			4.怎么实现批量添加
				INSERT INTO USER (id,username,PASSWORD) VALUES(1,'第一帅玮','1234qwer'),
					(2,'王嘉伟','12345678'),
					(3,'小马哥','1234'),
					(4,'申梦雨','abcd');
	2.删除数据：
		* 语法：
			* delete from 表名 [where 条件]
			//delete 而不是drop
			//DELETE FROM lmq WHERE age=26;
		* 注意：
			1. 如果不加条件，则删除表中所有记录。
			2. 如果要删除所有记录（//面试题）
				1. delete from 表名; -- 不推荐使用。有多少条记录就会执行多少次删除操作//一条一条数据地删
				2. TRUNCATE TABLE 表名; -- 推荐使用，效率更高 先删除表，然后再创建一张一样的表。 //直接删除整张表再创建一个相同的空表
	3. 修改数据：
		* 语法：
			* update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 条件];
			//update而不是alter
		* 注意：	
			1. 如果不加任何条件，则会将表中所有记录全部修改。			
				
//-------------------------------------------------------------------------------------------------------
	操作数据库或者表的增删改查(DDL)
		增：create
		删：drop
		改：alter
		查：show
	操作数据的增删改查
		增：insert into
			特点：将数据从外面到表里面
		删：delete
			特点：将数据从表里面到外面
		改：update
			特点：将数据从外面到表里面
		查：select
			特点：将数据从表里面到外面
		//所以，delete和select后面是from
//-----------------------------------------------------------------------------------------------------------

二、DQL
	//特点：不会修改到表中的数据
		select * from 表名;

	1. 语法：
		select
			字段列表
		from
			表名列表
		where
			条件列表
		group by
			分组字段
		having
			分组之后的条件
		order by
			排序
		limit
			分页限定
		
	2. 基础查询
		1. 多个字段的查询
			select 字段名1，字段名2... from 表名；
			* 注意：
				* 如果查询所有字段，则可以使用*来替代字段列表。//sql优化   不建议使用*
		2. 去除重复：
			* distinct
			-- 查询地址是蚌埠的人,且把名字重复的人去掉
			SELECT DISTINCT NAME FROM lmq WHERE address = "蚌埠"

		3. 计算列
			* 一般可以使用四则运算计算一些列的值。（一般只会进行数值型的计算）
			* ifnull(表达式1,表达式2)： 
				* 表达式1：哪个字段需要判断是否为null
				* 如果该字段为null后的替换值。
				
			 //null参与的运算，计算结果都为null
			 //字符串参与运算，这个时候字符串的值为0；
			
		4. 起别名：
			* as：as也可以省略		//不建议你省略as


	3. 条件查询
		1. where子句后跟条件
		2. 运算符
			* > 、< 、<= 、>= 、= 、<>
								//=  和java‘中判断相等不同，这里只能有一个等号
								//<>   不等于
			* BETWEEN...AND  
					SELECT * FROM student WHERE age BETWEEN 11 AND 12;
						//注意between后面的值是较小的  and后面的值是较大的     不能写反了
			* IN( 集合) 
			
			* IS NULL  
				//null不能与=仪器使用，只能是  is null   或者  is  not  null。
			* and  或 &&
			* or  或 || 
			* not  或 !
			
				-- 查询年龄大于20岁

				SELECT * FROM student WHERE age > 20;
				
				SELECT * FROM student WHERE age >= 20;
				
				-- 查询年龄等于20岁
				SELECT * FROM student WHERE age = 20;
				
				-- 查询年龄不等于20岁
				SELECT * FROM student WHERE age != 20;
				SELECT * FROM student WHERE age <> 20;
				
				-- 查询年龄大于等于20 小于等于30
				
				SELECT * FROM student WHERE age >= 20 &&  age <=30;
				SELECT * FROM student WHERE age >= 20 AND  age <=30;
				SELECT * FROM student WHERE age BETWEEN 20 AND 30;
				
				-- 查询年龄22岁，18岁，25岁的信息
				SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25
				SELECT * FROM student WHERE age = 22 || age = || OR age = 25
				SELECT * FROM student WHERE age  IN (22,18,25);   //sql优化   尽量不要使用in,
				--查询年龄不在22岁,18岁,25岁集合范围内的信息
				SELECT * FROM student WHERE age NOT IN (22,18,25);
				
				
				-- 查询英语成绩为null
				SELECT * FROM student WHERE english = NULL; -- 不对的。null值不能使用 = （!=） 判断
				
				SELECT * FROM student WHERE english IS NULL;
				
				-- 查询英语成绩不为null
				SELECT * FROM student WHERE english  IS NOT NULL;
		
		模糊查询：
				精确查询：
					SELECT * FROM student WHERE NAME = '第一帅玮';
		
			* LIKE：模糊查询
				* 占位符：
					* _:单个任意字符
					* %：多个任意字符
				//当需求中提到第几个的时候，肯定是使用_	
		-- 查询姓马的有哪些？ like
			SELECT * FROM student WHERE NAME LIKE '马%';
			-- 查询姓名第二个字是化的人
			
			SELECT * FROM student WHERE NAME LIKE "_化%";
			
			-- 查询姓名是3个字的人
			SELECT * FROM student WHERE NAME LIKE '___';

		-- 查询姓名中包含德的人
			SELECT * FROM student WHERE NAME LIKE '%德%';

		扩展：
			SELECT * FROM student WHERE NAME LIKE '%/_%' ESCAPE '/';

			SELECT * FROM student WHERE NAME LIKE '%/%' ESCAPE '/';
				
//------------------------------------------------------------------------------------------------------------
day02  Mysql约束
	一、排序查询
		1. 排序查询
			* 语法：order by 子句
				* order by 排序字段1 排序方式1 ，  排序字段2 排序方式2...
					//排序字段1 是列名      排序方式1   升序/降序

			* 排序方式：
				* ASC：升序，默认的。
				--查询表中所有的数据,且按照年龄升序来排列
				SELECT * FROM lmq ORDER BY age ASC;
				//若果不加ASC,默认为根据ASC,进行升序排列
				
				* DESC：降序。
				--查询表中所有的数据,且按照年龄降序来排列
				SELECT * FROM lmq ORDER BY age DESC;

			* 注意：
				* 如果有多个排序条件，则当前边的条件值一样时，才会判断第二条件。
					//条件之间使用   逗号   分隔
				--查询表中所有的数据,且按照年龄升序来排列
				SELECT * FROM lmq ORDER BY age DESC ,id asc;
				//查询表中所有数据,按照年龄进行降序排列,当年龄一样时,按照ID进行升序排列

		2.聚合函数：将一列数据作为一个整体，进行纵向的计算。
			//聚合函数式对某一列进行计算,如果值为null,则不参与运算
			1. count：计算个数
				1. 一般选择非空的列：主键
				2. count(*)   count(1)
				--计算lmq表中的姓名的总个数
				select count(name) from lmq;
				//默认如果姓名是null,则不参与计算
				select count(ifnull(name,0)) from lmq;
				//计算lmq表中的姓名的总个数,如果姓名为null,则将null值替换为0
			
			2. max：计算最大值
			--计算lmq表中的年龄的最大值
			SELECT MAX(age) FROM lmq;
			
			3. min：计算最小值
			--计算lmq表中的年龄的最小值
			SELECT MIN(age) FROM lmq;
			
			4. sum：计算和
			--计算lmq表中的年龄的总和
			SELECT SUM(age) FROM lmq;

			5. avg：计算平均值
			--计算lmq表中的年龄的平均值
			SELECT AVG(age) FROM lmq;
			
			* 注意：聚合函数的计算，排除null值。
			解决方案：
				1. 选择不包含非空的列进行计算
				2. IFNULL函数	
				
	//聚合函数不能直接作为查询条件,如:where 表名1.列名n=COUNT(表名2.列名m),聚合函数只能通过子查询作为查询条件被使用,要么就作为查询字段被使用
				
		3.分组查询:
			1. 语法：group by 分组字段；
			2. 注意：
				1. 分组之后查询的字段：分组字段、聚合函数
				2. where 和 having 的区别？
					1. where 在分组之前进行限定，如果不满足条件，则不参与分组。having在分组之后进行限定，如果不满足结果，则不会被查询出来
					2. where 后不可以跟聚合函数，having可以进行聚合函数的判断。
					//where是在分组之前进行限定,限定之后进行分组,分组之后进行查询,查询之后再通过having对查询结果进行限定,最终显示结果
					//having只能跟在分组后面,不可以跟在where后面,否则虽然sql语句不会报错,但是having后面的条件会无效
				-- 按照性别分组。分别查询男、女同学的平均分

				SELECT sex , AVG(math) FROM student GROUP BY sex;
				//按照性别进行分组,查询分组后的每组的性别以及分组后的每组数学成绩的平均分,如果分组后的每组中有成绩为null,则不对null值进行计算
				
				-- 按照性别分组。分别查询男、女同学的平均分,人数
				
				SELECT sex , AVG(math),COUNT(id) FROM student GROUP BY sex;
				//按照性别进行分组,查询分组后的每组的性别以及分组后的每组的数学平均成绩和每组的id个数,如果数学成绩和id有为null值的,则不对null值
				//进行计算,例如男同学组内的id都不为null,统计个数为4,但是数学成绩只有一个为90分,其他三人为null,那么查询结果中平均分为90,id对应的
				//count值为4
				
				--  按照性别分组。分别查询男、女同学的平均分,人数 要求：分数低于70分的人，不参与分组
				SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex;
				
				--  按照性别分组。分别查询男、女同学的平均分,人数 要求：分数低于70分的人，不参与分组,分组之后。人数要大于2个人
				SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
				
				SELECT sex , AVG(math),COUNT(id) 人数 FROM student WHERE math > 70 GROUP BY sex HAVING 人数 > 2;		
				
			//最后一条语句分析：	
				SELECT
					sex , AVG(math),COUNT(id) 人数    //性别、数学平均分、人数
				FROM 
					student      //在学生表中查询的
				WHERE 	
					math > 70     //查询的条件是数学成绩大于70分的
				GROUP BY 
					sex 		//根据性别来分组（70分及其以下的是没有参与分组的）
				HAVING
					人数 > 2;	//把分组之后人数大于2的组保留	
				
	
	4.分页查询
		1. 语法：limit 开始的索引,每页查询的条数;//本质
		2. 公式：开始的索引 = （当前的页码 - 1） * 每页显示的条数
			-- 每页显示3条记录 

			SELECT * FROM student LIMIT 0,3; -- 第1页
			
			SELECT * FROM student LIMIT 3,3; -- 第2页
			
			SELECT * FROM student LIMIT 6,3; -- 第3页

		3. limit 是一个MySQL"方言"		
		
		问题：（1）什么是分页？
			  分页其实是一个前端的概念。
			（2）为什么要分页？
				因为数据太多了，一个页面中根本放不下。
			（3）limit后面其实也可以只跟一个参数
				//这个时候，后面的2指的是要查询的数据的数量为2.默认从0号索引开始。
				SELECT * FROM student LIMIT 2
//-=---------------------------------------------------------------------------------------------------		
		
	二.约束
		用来限制列的
		概念： 对表中的数据进行限定，保证数据的正确性、有效性和完整性。	
			* 分类：
				1. 主键约束：primary key
				2. 非空约束：not null
				3. 唯一约束：unique
				4. 外键约束：foreign key
		
		1.非空约束
			//功能：限制某一列里面的数据不能为空
			非空约束：not null，某一列的值不能为null
			1. 创建表时添加约束   //掌握
				CREATE TABLE stu(
					id INT,
					NAME VARCHAR(20) NOT NULL -- name为非空
				);
			2. 创建表完后，添加非空约束
				ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;

			3. 删除name的非空约束
				ALTER TABLE stu MODIFY NAME VARCHAR(20);
		2.唯一约束
			唯一约束：unique，某一列的值不能重复
			1. 注意：
				* 唯一约束可以有NULL值，但是只能有一条记录为null
			2. 在创建表时，添加唯一约束   //掌握
				CREATE TABLE stu(
					id INT,
					phone_number VARCHAR(20) UNIQUE -- 手机号
				);
			3. 删除唯一约束
				ALTER TABLE stu DROP INDEX phone_number;
			4. 在表创建完后，添加唯一约束
				ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
				//注意：唯一约束是限制不了null的
				
				
	------------------------------------------------------------------------------------------------------
	
		
		//SQL执行顺序：☆☆☆☆☆
		
			 [4]SELECT 												
				[4-1]COUNT(*)/(SELECT COUNT(*) FROM t_order) avgs,  //不建议在select关键字后使用子查询!会影响sql的执行效率,用count(*)除以一个单行单列的子查询的结果,起别名为avgs
				[4-2]COUNT(*) cnt, 								//这里的(SELECT COUNT(*) FROM t_order)是单行单列的子查询,这样会影响sql的执行效率,不建议在select关键字后面使用子查询
				o.setmeal_id,
				s.name
			 [1]FROM t_order o,t_setmeal s
			 [2]WHERE o.setmeal_id = s.id
			 [3-1]GROUP BY o.setmeal_id,s.name [3-2]having count(*) > 1   //having只能跟在分组后面,不可以跟在where后面,否则虽然sql语句不会报错,但是having后面的条件会无效
			 [5]ORDER BY cnt desc,avgs asc
			 [6]LIMIT 3	
			 
			 执行顺序:1 -> 2-> [3-1] -> [3-2] -> [4-1] -> [4-2] -> 5 -> 6
				
				
				
				
				
		
		
		
		
		
		
		
		
		
				
				
				